package d01007;

public class Demo {
    public static void main(String[] args){
        //如何创建对象?
        //类名 对象名/引用名 = new 类名();
        Student s;
        s = new Student();
        //如何访问对象属性 成员运算符 .      对象名.属性名
        System.out.println("学号："+s.stuId+",姓名："+s.stuName+",年龄："+s.age);
        //属性赋值
        s.stuId=1001;
        s.age=20;
        s.stuName="小明";
        System.out.println("学号："+s.stuId+",姓名："+s.stuName+",年龄："+s.age+",地址："+s.addr);

        Student s2 = new Student();
        s2.stuId=1002;
        s2.age=21;
        s2.stuName="康康";
        System.out.println("学号："+s2.stuId+",姓名："+s2.stuName+",年龄："+s2.age+",地址："+s2.addr);
        /*
        //给学生地址属性赋值
        s.addr.province="湖南省";
        s.addr.city="衡阳市";
        s.addr.area="珠晖区";
        //注意：s.addr获取地址对象  此时地址对象是null
        //如何解决？
        //解决方法一：Address addr = new Address(); Student类中地址属性
        System.out.println("学号："+s.stuId+",姓名："+s.stuName+",年龄："+s.age+",地址："+s.addr.province+s.addr.city+s.addr.area);
        s2.addr.province="湖南省";
        s2.addr.city="衡阳市";
        s2.addr.area="珠晖区";
        System.out.println("学号："+s2.stuId+",姓名："+s2.stuName+",年龄："+s2.age+",地址："+s2.addr.province+s2.addr.city+s2.addr.area);
        */
        //解决方法2：创建地址对象并给其属性值，最后将地址对象赋给学生对象中地址属性
        Address addr = new Address();
        addr.province="衡阳市";
        addr.city="衡阳市";
        addr.area="珠晖区";
        //将地址对象赋给学生对象地址属性
        s.addr=addr;
        System.out.println("学号："+s.stuId+",姓名："+s.stuName+",年龄："+s.age+",地址："+s.addr.province+s.addr.city+s.addr.area);
        //学生s和学生s2地址相同，可以共享一个地址对象
        s2.addr=addr;
        System.out.println("学号："+s2.stuId+",姓名："+s2.stuName+",年龄："+s2.age+",地址："+s2.addr.province+s2.addr.city+s2.addr.area);
        //创建教师对象
        Teacher t = new Teacher();
        t.tno=2001;
        t.tname="小鹅";
        t.addr=addr;
        System.out.println("教师编号："+t.tno+",姓名："+t.tname+",地址："+t.addr.province+t.addr.city+t.addr.area);

        //调用学生类中方法  对象名.方法名();
        s.study();
        s2.study();

        //调用教师类中方法  对象名.方法名();
        t.teach();
        System.out.println(s.getInfo());
    }
}
class Student{
     int stuId;//学号 整形类型
     String stuName;//姓名
     int age;//年龄
    //Address addr = new Address();// 地址 引用类型
    Address addr;//地址 引用类型

    /*
    成员方法的定义：
    [访问权限修饰符]  返回值 方法名([形参列表]){


         [return 值];

    }
    成员方法调用： [数据类型 变量名=]对象名.成员方法名（[实参列表]）


     */
    public void study(){
        System.out.println(stuName+"好好学习.......");
    }
    public String getInfo(){
        if(null==addr){
            return "学号："+stuId+",姓名："+stuName+",年龄："+age;
        }
        return "学号："+stuId+",姓名："+stuName+",年龄："+age+",地址："+addr.province+addr.city+addr.area;
    }
}

class Address{
    //属性 成员变量
    String province;//省份 引用类型
    String city;//市
    String area;//区县
}

class Teacher{
    int tno;
    String tname;
    Address addr;
    public void teach(){
        System.out.println(tname+"授课.........");
    }

}

class Student1{
    private int stuId;
    private String stuName;
    private int age;
    Address addr;
    public void setStuId(int stuId){
        this.stuId=stuId;
    }
    public void setStuName(String stuName){
        this.stuName=stuName;
    }
    public void setAge(int age){
        if (age<0||age>100){
            System.out.println("年龄不合法");
            return ;
        }
        this.age=age;
    }

    public int getStuId(){
        return stuId;
    }
    public String getStuName(){
        return stuName;
    }
    public int getAge(){
        return age;
    }
    public String getInfo(){
        if(null==addr){
            return "学号："+stuId+",姓名："+stuName+",年龄："+age;
        }
        return "学号："+stuId+",姓名："+stuName+",年龄："+age+",地址："+addr.province+addr.city+addr.area;
    }
}

